import CryptoJS from 'crypto-js'  //引用AES源码js

//十六位十六进制数作为密钥和密钥偏移量  前后端协定一致或前端进行定义通过非对称加密传给后端
let KEY = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");  // 密钥
let IV = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); // 偏移量

const setKeyIv = ({keyStr, ivStr}) => {
    KEY = keyStr
    IV = ivStr
}

/**
 * AES解密
 * @param{string} word 解密字段
 * @param{string} keyStr 自定义密钥
 * @param{string} ivStr 自定义偏移量
 * @return{string} 返回明文
 */
const Decrypt = (word, keyStr, ivStr)=>{
    let key = KEY
    let iv = IV

    if (keyStr !== undefined && ivStr !== undefined) {
        key = CryptoJS.enc.Utf8.parse(keyStr)
        iv = CryptoJS.enc.Utf8.parse(ivStr)
    }
    if (word !== null) {
        let decrypt = CryptoJS.AES.decrypt(word, key, {
            iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7 // CryptoJS.pad.ZeroPadding
        });
        let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
        return decryptedStr.toString();
    }
}

/**
 * AES加密
 * @param{string} word 加密字段
 * @param{string} keyStr 自定义密钥
 * @param{string} ivStr 自定义偏移量
 * @return{string} 返回密文
 */
const Encrypt = (word, keyStr, ivStr) => {
    let key = KEY
    let iv = IV

    if (keyStr !== undefined && ivStr !== undefined) {
        key = CryptoJS.enc.Utf8.parse(keyStr)
        iv = CryptoJS.enc.Utf8.parse(ivStr)
    }
    let encrypted = CryptoJS.AES.encrypt(word, key, {
        iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7 // CryptoJS.pad.ZeroPadding  常用PKCS5, PKCS7, NOPADDING
    });

    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
export default {
    Encrypt,
    Decrypt,
    setKeyIv
}